// utils/auth.js

/**
 * Token相关操作工具函数
 */

// 获取Token
export function getToken() {
  return uni.getStorageSync("token");
}

// 设置Token
export function setToken(token) {
  uni.setStorageSync("token", token);
}

// 移除Token
export function removeToken() {
  uni.removeStorageSync("token");
}

// 获取RefreshToken
export function getRefreshToken() {
  return uni.getStorageSync("refresh_token");
}

// 设置RefreshToken
export function setRefreshToken(token) {
  uni.setStorageSync("refresh_token", token);
}

// 移除RefreshToken
export function removeRefreshToken() {
  // 注意：HTTP-Only Cookie无法通过JS直接操作
  // 可以通过调用后端的logout接口来清除Cookie

  // 在小程序中，发送请求到服务端让服务端清除Cookie
  uni.request({
    url: "http://localhost:8080/auth/logout",
    method: "POST",
    withCredentials: true, // 确保发送Cookie
    complete: () => {
      console.log("已请求清除刷新令牌Cookie");
    },
  });
  uni.removeStorageSync("refresh_token");
}

// 完全退出登录，清除所有相关数据
export function logout() {
  // 清除令牌
  removeToken();
  // 清除token时间戳
  uni.removeStorageSync("tokenTimestamp");
  // 尝试清除refresh token cookie
  removeRefreshToken();
  // 清除用户信息
  uni.removeStorageSync("user");
  // 跳转到登录页
  uni.navigateTo({
    url: "/pages/login/login",
  });
}

// Base64 URL解码函数
function base64UrlDecode(str) {
  // 替换URL安全Base64为标准Base64
  let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
  // 添加填充字符
  while (base64.length % 4) {
    base64 += "=";
  }

  try {
    // 针对不同平台使用不同的解码方式
    if (typeof Buffer !== "undefined") {
      // Node.js环境
      return Buffer.from(base64, "base64").toString();
    } else if (typeof atob !== "undefined") {
      // 浏览器环境
      return decodeURIComponent(
        atob(base64)
          .split("")
          .map((c) => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2))
          .join("")
      );
    } else {
      // UniApp小程序环境 - 简单方法
      // 注意：这种方式不处理UTF-8字符，但对于验证token是否有效已足够
      return base64;
    }
  } catch (e) {
    console.error("Base64解码失败:", e);
    return null;
  }
}

// 检查Token是否有效 - 简化版本
export function isValidToken(token) {
  if (!token) return false;

  try {
    // 验证基本格式
    const parts = token.split(".");
    if (parts.length !== 3) return false;

    // 获取当前时间戳（秒）
    const now = Math.floor(Date.now() / 1000);

    // 仅检查token是否为Bearer格式，而不尝试解码和验证
    // 这是最安全的做法，服务器会验证token的有效性

    // 如果需要在前端验证过期时间，可以使用下面的方式从服务器获取或指定一个合理的过期时间
    // 例如假设token有效期为24小时
    const tokenTimestamp = parseInt(
      uni.getStorageSync("tokenTimestamp") || "0"
    );
    const expireTime = 1 * 60 * 1000; // 1分钟

    return Date.now() < tokenTimestamp + expireTime;
  } catch (e) {
    console.error("Token验证失败:", e);
    return false;
  }
}

// 保存token的同时记录时间戳
export function setTokenWithTimestamp(token) {
  setToken(token);
  uni.setStorageSync("tokenTimestamp", Date.now());
}

// 检查是否存在刷新令牌Cookie
export function checkRefreshTokenCookie() {
  // 由于HttpOnly Cookie无法通过JS直接检测，我们可以通过发送一个请求来间接检测
  return new Promise((resolve) => {
    uni.request({
      url: "http://localhost:8080/auth/check-refresh-token",
      method: "GET",
      withCredentials: true, // 确保发送Cookie
      success: (res) => {
        if (res.statusCode === 200 && res.data.hasRefreshToken) {
          resolve(true);
        } else {
          resolve(false);
        }
      },
      fail: () => {
        resolve(false);
      },
    });
  });
}

// 注意：在uni-app中，尤其是小程序环境，无法直接操作Cookie
// 如果需要处理RefreshToken，可能需要通过其他方式存储或与服务端交互
